package org.lql.algo.codecrush.week002;

import java.util.Arrays;

/**
 * @author: liangqinglong
 * @date: 2025-07-29 16:18
 * @description: 面试题 16.11. 跳水板 <a href="https://leetcode.cn/problems/diving-board-lcci/description/">...</a>
 **/
public class DivingBoard {

	/**
	 * 你正在使用一堆木板建造跳水板。有两种类型的木板，其中长度较短的木板长度为shorter，长度较长的木板长度为longer。
	 * 你必须正好使用k块木板。编写一个方法，生成跳水板所有可能的长度。
	 * <p>
	 * 返回的长度需要从小到大排列。
	 * <p>
	 * 示例 1：
	 * <p>
	 * 输入：
	 * shorter = 1
	 * longer = 2
	 * k = 3
	 * 输出：[3,4,5,6]
	 * 解释：
	 * 可以使用 3 次 shorter，得到结果 3；使用 2 次 shorter 和 1 次 longer，得到结果 4 。以此类推，得到最终结果。
	 * 提示：
	 * <p>
	 * 0 < shorter <= longer
	 * 0 <= k <= 100000
	 */
	public int[] divingBoard(int shorter, int longer, int k) {
		// 特殊情况：无木板
		if (k == 0) {
			return new int[0];
		}

		// 特殊情况：shorter == longer，只有一种长度
		if (shorter == longer) {
			return new int[]{shorter * k};
		}

		// 普通情况，从 0 个 longer 到 k 个 longer，一共 k+1 种组合
		int[] result = new int[k + 1];
		for (int i = 0; i <= k; i++) {
			int length = shorter * (k - i) + longer * i;
			result[i] = length;
		}
		return result;
	}

	public static void main(String[] args) {
		DivingBoard divingBoard = new DivingBoard();
		int[] result = divingBoard.divingBoard(1, 4, 6);
		System.out.println(Arrays.toString(result));
	}
}
